
import numpy as np

# NumPy中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素

# 整数数组索引
# 获取数组中(0,0),(1,1),(2,0)位置处的元素
def fun1():
    x = np.array([[1, 2], [3, 4], [5, 6]])
    y = x[[0, 1, 2], [0, 1, 0]]
    print(x)
    print(y)

# 获取 4X3 数组中的四个角的元素
def fun2():
    x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
    print('我们的数组是：')
    print(x)
    print('\n')

    rows = np.array([[0, 0], [3, 3]])
    cols = np.array([[0, 2], [0, 2]])
    y = x[rows, cols]
    print('这个数组的四个角元素是：')
    print(y)

# 可以借助切片:或者...与索引数组结合
def fun3():
    a = np.array([[1,2,3], [4,5,6],[7,8,9]])
    b = a[1:3, 1:3]
    c = a[1:3, [1, 2]]
    d = a[..., 1:]

    print(a)
    print(b)
    print(c)
    print(d)

# 布尔索引
# 获取大于5的元素
def fun4():
    x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
    print('我们的数组是：')
    print(x)
    print('\n')

    print('大于5的元素是：')
    print(x[x > 5])

# 使用~(取补运算符)过滤NaN
def fun5():
    a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
    print(a[~np.isnan(a)])

# 从数组中过滤掉非复数元素
def fun6():
    a = np.array([1, 2+6j, 5, 3.5+5j])
    print(a[np.iscomplex(a)])

# 花式索引
def fun7():
    x = np.arange(9)
    print(x)
    # 一维数组读取指定下标对应的元素
    print("----------读取下标对应的元素----------")
    x2 = x[[0, 6]]
    print(x2)

    print(x2[0])
    print(x2[1])

# 传入顺序索引数组
def fun8():
    x = np.arange(32).reshape((8, 4))
    print(x)
    # 二维数组读取指定下标对应的行
    print("----------读取下标对应的行----------")
    print(x[[4, 2, 1, 7]])

# 传入倒序索引数组
def fun9():
    x = np.arange(32).reshape(8, 4)
    print(x)
    # 二维数组读取指定下标对应的行
    print("----------读取下标对应的行----------")
    print(x[[-4, -2, -1, -7]])

# 传入多个索引数组,笛卡尔积
def fun10():
    x = np.arange(32).reshape(8, 4)
    print(x)
    # 二维数组读取指定下标对应的行
    print("---------------------------")
    print(x[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])])

if __name__ == '__main__':
    fun10()